package com.xiaolin.structure.hash.arrayandlinked;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName EntryLinked
 * @Description 节点链表
 * @Detail detail
 * @Author MyPC
 * @Date 2020/11/17
 * @Version 1.0
 */
public class EntryLinked {
    // 头结点
    private Employee head;

    /**
     * 添加或修改元素
     * @param e
     */
    public void add(Employee e){
        if(head==null){
            // 添加第一个节点
            head=e;
        }else {
            // 添加节点到最后或修改节点
            Employee pre=null;
            Employee temp=head;
            while (temp != null){
                // 如果id相等，则认为两个元素相等，只需修改数据即可
                if(temp.id == e.id){
                    System.out.println("元素id相等，修改数据");
                    temp.name=e.name;
                    return;
                }
                pre=temp;
                temp=temp.next;
            }
            pre.next=e;
        }
    }

    /**
     * 根据id获取元素
     * @param id
     * @return
     */
    public Employee getOne(int id){
        if(head==null){
            //该链表无节点
            return null;
        }else {
            Employee temp=head;
            while (temp !=null){
                if(temp.id == id){
                    return temp;
                }
                temp=temp.next;
            }
        }
        // 找不到元素，返回空
        return null;
    }

    /**
     * 获取前一个元素
     * @param id
     * @return
     */
    private Employee getPre(int id){
        Employee pre=null;
        Employee temp=head;
        while (temp != null){
            if(temp.getId()==id){
                // 返回节点的前一个元素
                return pre;
            }
            pre=temp;
            temp=temp.next;
        }
        return pre;
    }

    /**
     * 根据id移除元素
     * @param id
     */
    public void remove(int id){
        if(head==null){
            System.out.println("该链表无节点");
        }else {
            Employee remove = getOne(id);
            if(remove == null){
                System.out.println("找不到元素");
                return;
            }
            Employee pre = getPre(id);
            if(pre==null){
                //删除的是第一个元素
                head=head.next;
            }else if(remove.next == null){
                //删除的是最后一个元素
                pre.next=null;
            }else {
                pre.next=remove.next;
            }
        }
    }

    public List<Employee> list(){
        List<Employee> list=new ArrayList<>();
        Employee temp=head;
        while (temp!=null){
            list.add(temp);
            temp=temp.next;
        }
        return list;
    }

    /**
     * @ClassName Employee
     * @Description 雇员
     * @Detail detail
     * @Author MyPC
     * @Date 2020/11/17
     * @Version 1.0
     */
    @Data
    public static class Employee {
        int id;
        String name;
        Employee next;
        public Employee(int id,String name){
            this.id=id;
            this.name=name;
        }
    }
}
